//package com.perfma.xtest.tool;
//
//import com.deepoove.poi.util.TableTools;
//import com.deepoove.poi.xwpf.XWPFParagraphWrapper;
//import com.google.common.collect.Lists;
//import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
//import org.apache.poi.util.Units;
//import org.apache.poi.xddf.usermodel.chart.*;
//import org.apache.poi.xwpf.usermodel.*;
//import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSimpleField;
//import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTStyles;
//import org.openxmlformats.schemas.wordprocessingml.x2006.main.STOnOff;
//
//import java.io.FileOutputStream;
//import java.io.IOException;
//import java.nio.file.Files;
//import java.nio.file.Paths;
//import java.util.List;
//
///**
// * @author: junhui.si
// * @date: 2022-08-29 16:45
// **/
//public class TestReportWord {
//
//    public static void main(String[] args) throws Exception {
//        create();
//    }
//
//    public static void create2() throws Exception {
//        //创建word文档对象
//        XWPFDocument document = new XWPFDocument();
//
//
//        // 读取模板文档
//        XWPFDocument template = new XWPFDocument(Files.newInputStream(Paths.get("/Users/sijunhui/Downloads/1/标题模板.docx")));
//        // 获得模板文档的整体样式
//        CTStyles wordStyles = template.getStyle();
//        // 获取新建文档对象的样式
//        XWPFStyles newStyles = document.createStyles();
//        // 关键行// 修改设置文档样式为静态块中读取到的样式
//        newStyles.setStyles(wordStyles);
//
//        // 标题1，1级大纲
//        XWPFParagraph para1 = document.createParagraph();
//        // 关键行// 1级大纲
//        para1.setStyle("1");
//        XWPFRun run1 = para1.createRun();
//        // 标题内容
//        run1.setText("标题1");
//
//        // 标题2，2级大纲
//        XWPFParagraph para2 = document.createParagraph();
//        // 关键行// 2级大纲
//        para2.setStyle("2");
//        XWPFRun run2 = para1.createRun();
//        // 标题内容
//        run2.setText("标题2");
//
//        // 正文
//        XWPFParagraph paraX = document.createParagraph();
//        XWPFRun runX = paraX.createRun();
//        for (int i = 0; i < 100; i++) {
//            // 正文内容
//            runX.setText("正文\r\n");
//        }
//
//        String path = "/Users/sijunhui/Downloads/1/";
//        String fileName = path + "示例" + System.currentTimeMillis() + ".docx";
//        FileOutputStream fos = new FileOutputStream(fileName);
//        document.write(fos);
//        fos.close();
//
//    }
//
//
//    public static void create() throws Exception {
//        //创建word文档对象
//        XWPFDocument document = new XWPFDocument();
//
//        // 读取模板文档
//        XWPFDocument template = new XWPFDocument(Files.newInputStream(Paths.get("/Users/sijunhui/Downloads/1/tmp/title_level.docx")));
//        // 获得模板文档的整体样式
//        CTStyles wordStyles = template.getStyle();
//        // 获取新建文档对象的样式
//        XWPFStyles newStyles = document.createStyles();
//        // 关键行// 修改设置文档样式为静态块中读取到的样式
//        newStyles.setStyles(wordStyles);
//
//        //创建文本标题
//        XWPFParagraph index = document.createParagraph();
//        //设置段落居中
//        index.setAlignment(ParagraphAlignment.CENTER);
//        index.setStyle("1");
//        XWPFRun titleRun = index.createRun();
////        titleRun.setFontSize(20);
//        titleRun.setFontFamily("宋体");
//        titleRun.setText("报告标题");
//        for (int i = 0; i < 21; i++) {
//            titleRun.addCarriageReturn(); //换行
//        }
//
//        // 创建报告人
////        XWPFParagraph reporter = document.createParagraph();
//        //设置段落居中
////        reporter.setAlignment(ParagraphAlignment.CENTER);
//        XWPFRun reporterRun = index.createRun();
//        reporterRun.setFontSize(10);
//        reporterRun.setFontFamily("宋体");
//        reporterRun.setText("报告人");
//        reporterRun.addCarriageReturn(); //换行
//
//        // 报告时间
////        XWPFParagraph time = document.createParagraph();
//        //设置段落居中
////        time.setAlignment(ParagraphAlignment.CENTER);
//        XWPFRun timeRun = index.createRun();
//        timeRun.setFontSize(10);
//        timeRun.setFontFamily("宋体");
//        timeRun.setText("报告时间");
//        timeRun.addBreak(BreakType.PAGE); //换行
//
//        // 目录
//        XWPFParagraph toc = document.createParagraph();
//        toc.setAlignment(ParagraphAlignment.CENTER);
//        XWPFRun tocTitleRun = toc.createRun();
//        tocTitleRun.setText("目录");
//        tocTitleRun.addCarriageReturn(); //换行
//
//        // 目录
////        XWPFParagraph toc = document.createParagraph();
////        toc.setAlignment(ParagraphAlignment.LEFT);
//        XWPFRun tocRun = toc.createRun();
//        tocRun.setText("toc");
////        tocRun.addBreak(BreakType.PAGE);
//
//        // 大纲结构
//        for (int i = 1; i < 10; i++) {
//            buildSe(document, i);
//        }
//
//        generateTOC(document);
//
//        //路径问题处理
//        String path = "/Users/sijunhui/Downloads/1/";
//        String fileName = path + "分析报告" + System.currentTimeMillis() + ".docx";
//        FileOutputStream fos = new FileOutputStream(fileName);
//        document.write(fos);
//        fos.close();
//    }
//
//    private static void buildSe(XWPFDocument document, int i) throws IOException, InvalidFormatException {
//        // 标题1
//        XWPFParagraph paragraph = document.createParagraph();
//        paragraph.setStyle("1");
//        XWPFRun run = paragraph.createRun();
//        run.setText("标题" + i);
//        // 子标题2
//        XWPFParagraph paragraph2 = document.createParagraph();
//        paragraph2.setStyle("2");
//        XWPFRun run2 = paragraph2.createRun();
//        run2.setText("子2标题");
//        // 子标题3
//        paragraph2 = document.createParagraph();
//        paragraph2.setStyle("3");
//        run2 = paragraph2.createRun();
//        run2.setText("子3标题");
//        // 子标题4
//        paragraph2 = document.createParagraph();
//        paragraph2.setStyle("4");
//        run2 = paragraph2.createRun();
//        run2.setText("子4标题");
//        // 子标题5
//        paragraph2 = document.createParagraph();
//        paragraph2.setStyle("5");
//        run2 = paragraph2.createRun();
//        run2.setText("子5标题");
//
//        buildTable(document);
//        buildChart(document);
//        buildTable2(document);
//
////        //添加内容段落  首先展示分析表格
////        XWPFParagraph tableParagraph = document.createParagraph();
////        tableParagraph.setAlignment(ParagraphAlignment.valueOf(STJc.INT_LEFT));
////        XWPFRun tableRun = tableParagraph.createRun();
////        tableRun.setFontSize(10);
////        tableRun.addTab();
////        tableRun.setText("表格标题");
////
////
////        //设置列头信息
////        table.getRow(0).setHeight(500);
////        for (int j = 0; j < listColumns.size(); j++) {
////            setCellText(table.getRow(0).getCell(j), listColumns.get(j), null, 1000);
////        }
////        //表格内容： 行首及内容信息
////        Integer j = 0;
////        for (int index = 0; index < listLineData.size(); index++) {   //listLineData 表示行数据集合
////            //这个是在表格的添加,添加到第几行
////            List<String> item = listLineData.get(index);
////            XWPFTableRow row = table.insertNewTableRow(j + 1);
////            //设置单元格高
////            row.setHeight(1000);
////            for (int i = 0; i < listColumns.size(); i++) {
////                XWPFTableCell cell = row.createCell();
////                CTTc ctTc = cell.getCTTc();
////                CTTcPr ctTcPr = ctTc.addNewTcPr();
////                ctTcPr.addNewTcW().setW(BigInteger.valueOf(1000));
////                cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART);
////                if (StringUtils.isNotBlank(item.get(i))) {
////                    cell.setText(item.get(i)); //单元格文本填充
////                } else {
////                    cell.setText(null);
////                }
////            }
////        }
//    }
//
//    public static void generateTOC(XWPFDocument document) throws Exception {
//        String findText = "toc";
//        String replaceText = "";
//        for (XWPFParagraph p : document.getParagraphs()) {
//            for (XWPFRun r : p.getRuns()) {
//                int pos = r.getTextPosition();
//                String text = r.getText(pos);
//                System.out.println(text);
//                if (text != null && text.contains(findText)) {
//                    text = text.replace(findText, replaceText);
//                    r.setText(text, 0);
////                    addField(p, "TOC \\o \"1-9\" \\h \\z \\u");
//                    addField(p, "TOC \\h");
//                    break;
//                }
//            }
//        }
//    }
//
//    private static void addField(XWPFParagraph paragraph, String fieldName) {
//        CTSimpleField ctSimpleField = paragraph.getCTP().addNewFldSimple();
//        ctSimpleField.setInstr(fieldName);
//        ctSimpleField.setDirty(STOnOff.TRUE);
//        ctSimpleField.addNewR().addNewT().setStringValue("<<fieldName>>");
//    }
//
//    private static void buildTable(XWPFDocument document) {
//        //创建列数，listColumns表示表格列头数据封装集合
//        XWPFTable table = document.createTable();
//        //设置表格居中展示
////        CTJc jc = table.getCTTbl().getTblPr().getJc();
////        if (jc == null) {
////            jc = table.getCTTbl().getTblPr().addNewJc();
////        }
////        jc.setVal(STJc.CENTER);
//
//        // 表头
//        List<String> header = Lists.newArrayList();
//        for (int i = 0; i < 8; i++) {
//            header.add("表头" + i);
//        }
//        XWPFTableRow firstRow = table.getRow(0);
//        for (int i = 0; i < header.size(); i++) {
//            if (i == 0) {
//                firstRow.getCell(i).setText(header.get(i));
//            } else {
//                firstRow.addNewTableCell().setText(header.get(i));
//            }
//        }
//        XWPFTableRow secondRow = table.createRow();
//        for (int i = 0; i < header.size(); i++) {
//            secondRow.getCell(i).setText(header.get(i));
//        }
//
//        // 数据
//        for (int i = 1; i < 8; i++) {
//            XWPFTableRow row = table.createRow();
//            for (int j = 0; j < 8; j++) {
//                if (j != 3) {
//                    row.getCell(j).setText("数据xxxxxxxxxx" + j);
//                } else {
//                    XWPFParagraph p = row.getCell(j).getParagraphs().get(0);
//                    XWPFParagraphWrapper wrapper = new XWPFParagraphWrapper(p);
//                    XWPFRun hyperRun = wrapper.insertNewHyperLinkRun(0, "https://www.baidu.com/");
//                    hyperRun.removeBreak();
//                    hyperRun.removeCarriageReturn();
//                    hyperRun.removeTab();
//                    hyperRun.setText("百度超链");
//                    hyperRun.setColor("0000FF");
//                    hyperRun.setUnderline(UnderlinePatterns.NONE);
//                }
//            }
//        }
//        // 合并表头
//        TableTools.mergeCellsVertically(table, 0, 0, 1);
//        TableTools.mergeCellsVertically(table, 1, 0, 1);
//        TableTools.mergeCellsVertically(table, 7, 0, 1);
//
//        TableTools.mergeCellsHorizonal(table, 0, 2, 4);
//        TableTools.mergeCellsHorizonal(table, 0, 3, 4);
//
//        // 合并单元格
//        TableTools.mergeCellsVertically(table, 0, 2, 3);
//        TableTools.mergeCellsVertically(table, 4, 2, 3);
//    }
//
//    private static void buildTable2(XWPFDocument document) {
//        //创建列数，listColumns表示表格列头数据封装集合
//        XWPFTable table = document.createTable();
//
//        // 数据
//        XWPFTableRow firstRow = table.getRow(0);
//        for (int i = 0; i < 2; i++) {
//            if (i == 0) {
//                firstRow.getCell(i).setText("数据");
//            } else {
//                firstRow.addNewTableCell().setText("");
//            }
//        }
//        XWPFTableRow secondRow = table.createRow();
//        for (int i = 0; i < 2; i++) {
//            secondRow.getCell(i).setText("");
//        }
//        XWPFTableRow row3 = table.createRow();
//        for (int i = 0; i < 2; i++) {
//            row3.getCell(i).setText("数据2");
//        }
//
//        TableTools.mergeCellsHorizonal(table, 0, 0, 1);
//        TableTools.mergeCellsHorizonal(table, 1, 0, 1);
//
//        TableTools.mergeCellsVertically(table, 0, 0, 1);
//        System.out.println(table);
//    }
//
//    private static void buildChart(XWPFDocument document) throws IOException, InvalidFormatException {
//        int pointCount = 300;
//        // 2、创建chart图表对象,抛出异常
//        XWPFChart chart = document.createChart(15 * Units.EMU_PER_CENTIMETER, 15 * Units.EMU_PER_CENTIMETER);
//        // 3、图表相关设置
//        chart.setTitleText("折线图标题"); // 图表标题
//        chart.setTitleOverlay(false); // 图例是否覆盖标题
////        chart.setChartHeight(50L);
//
//        // 4、图例设置
//        XDDFChartLegend legend = chart.getOrAddLegend();
//        legend.setPosition(LegendPosition.BOTTOM); // 图例位置:上下左右
//        legend.setOverlay(false);
//
//        // 5、X轴(分类轴)相关设置
//        XDDFCategoryAxis xAxis = chart.createCategoryAxis(AxisPosition.BOTTOM); // 创建X轴,并且指定位置
//        xAxis.setTitle("日期（年月）"); // x轴标题
////        String[] xAxisData = new String[]{
////                "2021-01", "2021-02", "2021-03", "2021-04", "2021-05", "2021-06",
////                "2021-07", "2021-08", "2021-09", "2021-10", "2021-11", "2021-12",
////        };
//        List<Integer> tempList = Lists.newArrayList();
//        for (int i = 0; i < pointCount; i++) {
//            tempList.add(i);
//        }
//        Integer[] xAxisData = tempList.toArray(new Integer[]{});
//        XDDFNumericalDataSource xAxisSource = XDDFDataSourcesFactory.fromArray(xAxisData); // 设置X轴数据
//
//        // 6、Y轴(值轴)相关设置
//        XDDFValueAxis yAxis = chart.createValueAxis(AxisPosition.LEFT); // 创建Y轴,指定位置
//        yAxis.setTitle("粉丝数（个）"); // Y轴标题
//        tempList.clear();
//        for (int i = 0; i < pointCount; i++) {
//            tempList.add((int) (Math.random() * 100));
//        }
//        Integer[] yAxisData = tempList.toArray(new Integer[]{});
//        XDDFNumericalDataSource<Integer> yAxisSource = XDDFDataSourcesFactory.fromArray(yAxisData); // 设置Y轴数据
//
//        tempList.clear();
//        for (int i = 0; i < pointCount; i++) {
//            tempList.add((int) (Math.random() * 200));
//        }
//        Integer[] yAxisData2 = tempList.toArray(new Integer[]{});
//        XDDFNumericalDataSource<Integer> yAxisSource2 = XDDFDataSourcesFactory.fromArray(yAxisData2); // 设置Y轴数据
//
//        // 7、创建折线图对象
//        XDDFLineChartData lineChart = (XDDFLineChartData) chart.createData(ChartTypes.LINE, xAxis, yAxis);
//
//        // 8、加载折线图数据集
//        XDDFLineChartData.Series lineSeries = (XDDFLineChartData.Series) lineChart.addSeries(xAxisSource, yAxisSource);
//        lineSeries.setTitle("曲线1", null); // 图例标题
//        lineSeries.setSmooth(false); // 线条样式:true平滑曲线,false折线
//        lineSeries.setMarkerSize((short) 2); // 标记点大小
//        lineSeries.setMarkerStyle(MarkerStyle.CIRCLE); // 标记点样式
//
////        XDDFLineChartData.Series lineSeries2 = (XDDFLineChartData.Series) lineChart.addSeries(xAxisSource, yAxisSource2);
////        lineSeries2.setTitle("曲线2", null); // 图例标题
////        lineSeries2.setSmooth(false); // 线条样式:true平滑曲线,false折线
////        lineSeries2.setMarkerSize((short) 2); // 标记点大小
////        lineSeries2.setMarkerStyle(MarkerStyle.CIRCLE); // 标记点样式
//
//        for (int i = 0; i < 20; i++) {
//            XDDFLineChartData.Series lineSeries2 = (XDDFLineChartData.Series) lineChart.addSeries(xAxisSource, yAxisSource2);
//            lineSeries2.setTitle("曲线x" + i, null); // 图例标题
//            lineSeries2.setSmooth(false); // 线条样式:true平滑曲线,false折线
//            lineSeries2.setMarkerSize((short) 2); // 标记点大小
//            lineSeries2.setMarkerStyle(MarkerStyle.CIRCLE); // 标记点样式
//        }
//
//        // 9、绘制折线图
//        chart.plot(lineChart);
//    }
//}
